/*接在寄存器前面的第一个选择器，决定需要写入的寄存器是来自rt还是rd，RegDes是控制器发来的信号*/
module MuxReg (
    rt,
    rd,
    RegDes,
    des_reg
);
    parameter   RT = 1'b1, RD = 1'b0;                           // RegDst
    input [4:0] rt;
    input [4:0] rd;
    input RegDes;
    output reg [4:0] des_reg;
    always @(*) begin
        if(RegDes==RT)
            des_reg = rt;
        else
            des_reg = rd;
    end
endmodule //mux_reg

/*接在alu前面的选择器 ，决定ALU第二个输入数据是立即数还是rt*/
module MuxAlu (
    rd2,immediate,AluSrc,b
);
    input [31:0] rd2;
    input [31:0] immediate;
    input AluSrc;
    parameter   RD2 = 1'b1, IMMEDIATE_NUMBER = 1'b0;            // AluSrc
    output reg [31:0] b;
    always @(*) begin
        if(AluSrc==RD2)
            b=rd2;
        else
            b=immediate;
    end
endmodule //mux_alu
  //MuxAlu mux_alu(rd2, {{16{instr[15]}}, instr[15:0]}, AluSrc, b);
/*接在datamemory前面的选择器，用来选择写入的数据是alu计算结果还是从内存读入*/
module MuxDm (
    dout, //内存读入的数据
    result, //ALU计算结果
    MemtoReg, //可以写的信号
    writedata
);
    input[31:0] dout;
    input[31:0] result;
    input MemtoReg;
    output reg[31:0] writedata; 
    always @(*) begin
        if(MemtoReg)
            writedata = dout;
        else
            writedata = result;
    end
endmodule //mux